package com.oig.sys.base.service.impl;

import com.oig.common.constants.CommonEnum;
import com.oig.common.exception.BadRequestException;
import com.oig.sys.base.dao.ITbEnumItemDao;
import com.oig.sys.base.dto.EnumItemDto;
import com.oig.sys.base.entity.TbEnumItem;
import com.oig.sys.base.service.ITbEnumItemService;
import com.oig.sys.base.vo.EnumItemVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @author wuxl
 */
@Service
public class TbEnumItemServiceImpl implements ITbEnumItemService {

	private final ITbEnumItemDao tbEnumItemDao;

	@Autowired
	public TbEnumItemServiceImpl( ITbEnumItemDao tbEnumItemDao){
		 this.tbEnumItemDao = tbEnumItemDao;
	}

	@Transactional
	@Override
	public EnumItemVo addEnumItem(EnumItemDto enumItemDto) {
		TbEnumItem enumItem = this.tbEnumItemDao.getByItemCodeAndDictId(enumItemDto.getItemCode(), enumItemDto.getDictId()) ;
		if (enumItem!=null){
			throw new BadRequestException("枚举值重复") ;
		}
		enumItem = new TbEnumItem();
		BeanUtils.copyProperties(enumItemDto, enumItem);
		enumItem.setStatus(CommonEnum.CommonStatusEnum.OK.getCode());
		if (enumItemDto.getShowFlag()==null){
			enumItem.setShowFlag(CommonEnum.FlagEnum.TRUE_FLAG.getCode());
		}
		if (enumItemDto.getModifyFlag()==null){
			enumItem.setModifyFlag(CommonEnum.FlagEnum.TRUE_FLAG.getCode());
		}
		this.tbEnumItemDao.save(enumItem) ;
		return this.buildVo(enumItem);
	}

	private EnumItemVo buildVo(TbEnumItem enumItem){
		EnumItemVo enumItemVo = new EnumItemVo();
		BeanUtils.copyProperties(enumItem, enumItemVo);
		return enumItemVo;
	}

	@Transactional
	@Override
	public List<EnumItemVo> addAllEnumItem(Integer dictId, List<EnumItemDto> enumItemDtoList) {
		List<EnumItemVo> enumItemVoList = new ArrayList<>();
		for (EnumItemDto enumItemDto : enumItemDtoList){
			enumItemDto.setDictId(dictId);
			enumItemVoList.add(this.addEnumItem(enumItemDto));
		}
		return enumItemVoList;
	}

	@Transactional
	@Override
	public EnumItemVo updateEnumItem(EnumItemDto enumItemDto) {
		TbEnumItem enumItem = this.tbEnumItemDao.getTbEnumItemById(enumItemDto.getId());
		if (enumItem==null){
			throw new BadRequestException("id错误") ;
		}
		if (!enumItem.getDictId().equals(enumItemDto.getDictId())){
			throw new BadRequestException("明细id传错") ;
		}
		if (CommonEnum.FlagEnum.FALSE_FLAG.getCode().equals(enumItem.getModifyFlag())){
			throw new BadRequestException("不允许修改");
		}
		TbEnumItem other = this.tbEnumItemDao.getByCodeExtId(enumItemDto.getItemCode(),enumItemDto.getDictId(), enumItem.getId()) ;
		if (other!=null){
			throw new BadRequestException("编码重复："+enumItemDto.getItemCode());
		}
		BeanUtils.copyProperties(enumItemDto, enumItem, "id");
		this.tbEnumItemDao.save(enumItem) ;
		return this.buildVo(enumItem);
	}

	@Transactional
	@Override
	public List<EnumItemVo> updateAllEnumItem(Integer dictId, List<EnumItemDto> enumItemDtoList) {
		List<EnumItemVo> enumItemVoList = new ArrayList<>();
		List<Integer> distItemIdList = new ArrayList<>() ;
		for (EnumItemDto enumItemDto : enumItemDtoList){
			enumItemDto.setDictId(dictId);
			EnumItemVo enumItemVo ;
			if (enumItemDto.getId()==null){
				enumItemVo = this.addEnumItem(enumItemDto) ;
			} else {
				enumItemVo = this.updateEnumItem(enumItemDto) ;
			}
			distItemIdList.add(enumItemVo.getId()) ;
			enumItemVoList.add(enumItemVo);
		}
		List<Integer> cantNotDelIdList =this.tbEnumItemDao.findAllCanNotDelId(dictId, distItemIdList) ;
		if (cantNotDelIdList!=null && !cantNotDelIdList.isEmpty()){
			throw new BadRequestException("不允许删除:"+cantNotDelIdList);
		}
		List<TbEnumItem> delList = this.tbEnumItemDao.findByDictIdAnIdNotIn(dictId, distItemIdList);
		if (delList!=null && !delList.isEmpty()){
			this.tbEnumItemDao.deleteAll(delList); //可以开启jpa批量操作，但是操作很少，数据量也很少，目前关系不大
		}
		return enumItemVoList;
	}

	@Override
	public List<EnumItemVo> findAllEnumItemByDict(Integer dictId){
		List<TbEnumItem> enumItemList = this.tbEnumItemDao.findByDictId(dictId);
		List<EnumItemVo> voList = new ArrayList<>();
		if (enumItemList!=null && !enumItemList.isEmpty()){
			enumItemList.forEach(item->voList.add(this.buildVo(item)));
		}
		return voList;
	}


	@Override
	public List<EnumItemVo> searchEnumItem(Integer dictId, String searchKey) {
		List<TbEnumItem> enumItemList = this.tbEnumItemDao.searchByNameOrCode(dictId, searchKey, CommonEnum.CommonStatusEnum.OK.getCode());
		List<EnumItemVo> voList = new ArrayList<>();
		if (enumItemList!=null && !enumItemList.isEmpty()){
			enumItemList.forEach(item->voList.add(this.buildVo(item)));
		}
		return voList;
	}

	@Transactional
	@Override
	public void delByDictId(Integer dictId) {
		List<TbEnumItem> delList = this.tbEnumItemDao.findByDictId(dictId);
		if (delList!=null && !delList.isEmpty()){
			this.tbEnumItemDao.deleteAll(delList); //可以开启jpa批量操作
		}
	}

	@Override
	public List<TbEnumItem> findAllItems() {
		return this.tbEnumItemDao.findAll();
	}
}
